package cn.tedu.tmall.admin.mall.service.impl;

import cn.tedu.tmall.admin.mall.dao.persist.repository.ICategoryRepository;
import cn.tedu.tmall.admin.mall.pojo.entity.Category;
import cn.tedu.tmall.admin.mall.pojo.param.CategoryAddNewParam;
import cn.tedu.tmall.admin.mall.pojo.vo.CategoryStandardVO;
import cn.tedu.tmall.admin.mall.service.ICategoryService;
import cn.tedu.tmall.common.enumerator.ServiceCode;
import cn.tedu.tmall.common.ex.ServiceException;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class CategoryServiceimpl implements ICategoryService {

    @Autowired
    private ICategoryRepository categoryRepository;


    @Transactional
    @Override
    public void addNew(CategoryAddNewParam categoryAddNewParam){

        // 在ICategoryRepository中添加抽象方法：CategoryStandardVO getStandardById(Long id);
        // 在CategoryRepositoryImpl中通过调用Mapper对象的方法，实现以上方法
        // 从当前方法的参数中取出parentId（声明成局部变量，后续还需要多次使用）
        Long parentId = categoryAddNewParam.getParentId();
        CategoryStandardVO parentCategory = null;
        // 判断parentId是否不为0
        if (parentId != 0) {
            // 是：调用Repository对象的getStandardById()方法执行查询，传入的参数就是parentId
            parentCategory = categoryRepository.getStandardById(parentId);
            // 判断查询结果是否为null
            if (parentCategory == null) {
                // 是：抛出异常（暂时抛出RuntimeException）
                throw new ServiceException(ServiceCode.ERROR_NOT_FOUND,"新增类别失败，父级类别不存在！");
            }
            // 判断父级类别的enable是否不为1
            if (parentCategory.getEnable() != 1) {
                // 是：抛出异常（暂时抛出RuntimeException）
                throw new ServiceException(ServiceCode.ERROR_CONFLICT,"新增类别失败，父级类别已经被禁用！");
            }
        }



        // TODO 类别名称必须唯一
        // 在ICategoryRepository添加抽象方法：int countByName(String name);
        // 在CategoryRepositoryImpl中实现以上方法：直接调用MyBatis Plus的selectCount(wrapper)方法
        // -- 以上调用方法的参数可以 wrapper.eq("name", name);
        // 在当前方法中，调用Repository对象的countByName()方法
        int countByName = categoryRepository.countByName(categoryAddNewParam.getName());
        //判断以上统计结果是否大于0
        if (countByName > 0){
            throw new ServiceException(ServiceCode.ERROR_CONFLICT,"新增类别失败，类型名称已被占用");
        }

        Category category = new Category();
        BeanUtils.copyProperties(categoryAddNewParam, category);
        // TODO 向category中补全属性值：depth, isParent
        //向category中补全属性值depth，isParent
         Integer depth = 1;
         if (parentId != 0){
             depth = parentCategory.getDepth() + 1;

         }
         category.setDepth(depth);
         category.setIsParent(0);
         int rows = categoryRepository.insert(category);
         if (rows != 1){
             throw new ServiceException(ServiceCode.ERROR_INSERT,"新增服务器失败，服务器忙，请稍后再试");
         }

        // TODO 如果本次添加的是某个类别的子级类别，可能需要将父级类别的isParent修改为1
        // 在ICategoryRepository添加抽象方法：int updateById(Category category);
        // 在CategoryRepositoryImpl中实现以上方法
        // 判断parentId是否不为0，且父级类别的isParent不为1
        if (parentId != 0 && parentCategory.getParentId() != 1){
            // -- 调用Repository对象的方法，将父级类别的isParent更新为1
            Category updateParentCategory = new Category();
            updateParentCategory.setId(parentId);
            updateParentCategory.setIsParent(1);
            categoryRepository.updateById(updateParentCategory);
            if (rows != 1){
                throw new ServiceException(ServiceCode.ERROR_UPDATE,"新增类别失败，服务器忙，请稍后再试");
            }
        }
    }
}
